home *** CD-ROM | disk | FTP | other *** search
- /*
- * Copyright (C) 1994, Silicon Graphics, Inc.
- * All Rights Reserved.
- *
- * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
- * the contents of this file may not be disclosed to third parties, copied or
- * duplicated in any form, in whole or in part, without the prior written
- * permission of Silicon Graphics, Inc.
- *
- * RESTRICTED RIGHTS LEGEND:
- * Use, duplication or disclosure by the Government is subject to restrictions
- * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
- * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
- * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
- * rights reserved under the Copyright Laws of the United States.
- */
- /*_______________________________________________________________________
- |
- | blixnetwork.c - handles reading and writing to the server
- |
- | This handles the network connection to the world-wide
- | highscore server.
- |
- | (c) 1994 Frans van Hoesel, hoesel@chem.rug.nl
- | Xtreme Graphics Software
- |
- */
-
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <sys/socket.h>
- #include <sys/time.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #include <netdb.h>
- #include <unistd.h>
- #include <string.h>
- #include <stdlib.h>
- #include <errno.h>
- #include <sys/ioctl.h>
- #include <limits.h>
- #include <bstring.h>
- #include <malloc.h>
-
- #include "blixnetwork.h"
- #include "blixscore_io.h"
- #include "blixtmpdir.h"
- #include "blix.h"
-
- #define SERVER "192.82.208.8:8181"
-
- int ioctl (int fildes, int request, ...);
- int select (int nfds, fd_set *readfds, fd_set *writefds,
- fd_set *exceptfds, struct timeval *timeout);
-
- int initstat=0;
- static struct sockaddr_in soc_address;
- static int serverfile = -1;
-
- int init_connect(void) {
-
- int status;
- char *server;
- char *port;
- char *tmp;
- char host[128];
-
- if (noworld) {
- initstat = -1;
- return initstat;
- }
- soc_address.sin_port = htons(8181);
- server = getenv("BLIXSERVER");
- if (server == NULL || strlen(server) > 126) {
- server = SERVER;
- }
- strcpy(host, server);
-
- port=strchr(host, ':');
- if (port != NULL) {
- *port++ = '\0';
- if (port[0] >= '0' && port[0] <='9') {
- soc_address.sin_port = htons(atol(port));
- }
- }
-
- for (tmp = host; *tmp != '\0'; tmp++)
- {
- if ((*tmp < '0' || *tmp > '9') && *tmp != '.') {
- fprintf(stderr, "%s: bad internet addres in BLIXSERVER "
- "(should be numeric internet address in "
- "dot notation\n", basename);
- exit(1);
- }
- }
- soc_address.sin_addr.s_addr = inet_addr(host);
- soc_address.sin_family = AF_INET;
-
- errno = 0;
- serverfile = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
- if (serverfile == -1) {
- initstat = -1;
- return initstat;
- }
- status = 1;
- ioctl(serverfile, FIONBIO, &status);
- status = connect(serverfile, (struct sockaddr*)&soc_address,
- sizeof(soc_address));
- if ((status == 0) || ((status < 0) &&
- ((errno == EINPROGRESS) || (errno == EAGAIN)))) {
- initstat = 0;
- } else {
- initstat = -1;
- }
- return initstat;
- }
-
- int make_connect(void) {
- struct timeval timeout;
- int ret;
- fd_set writefds;
- int retry;
- int status;
-
- if (initstat == -1) {
- return -1;
- }
- retry = 100;
- timeout.tv_sec = 0;
- timeout.tv_usec = 100000;
- ret = 0;
- errno = 0;
- while (ret <= 0) {
- if (retry-- < 0) {
- status = -1;
- ret = -1;
- }
- FD_ZERO(&writefds);
- FD_SET(serverfile, &writefds);
- ret = select(FD_SETSIZE, NULL, &writefds, NULL, &timeout);
- if ((ret < 0) && (errno != EALREADY)) {
- status = ret;
- break;
- } else if (ret > 0) {
- status = connect(serverfile, (struct sockaddr*)&soc_address,
- sizeof(soc_address));
- if ((status < 0)&&(errno == EISCONN)) {
- status = 0;
- }
- break;
- } else {
- status = connect(serverfile, (struct sockaddr*)&soc_address,
- sizeof(soc_address));
- if ((status < 0)&&(errno != EALREADY)&&(errno != EAGAIN)&&
- (errno != EISCONN)) {
- break;
- }
- }
- }
- if (status >= 0) {
- ret = 0;
- ioctl(serverfile, FIONBIO, &ret);
- } else {
- close(serverfile);
- serverfile = -1;
- initstat = -1;
- }
- return status;
- }
-
- int read_server(void *buf, int nbyte) {
- int result;
-
- if (initstat == -1 || serverfile <= 0 || server_ready()) {
- return -1;
- }
- result = read_data(serverfile, buf, nbyte);
- if (result != nbyte && result != - nbyte) {
- return -1;
- }
- return (result);
- }
-
- int read_serverstr(char *buf) {
- int result;
-
- if (initstat == -1 || serverfile == -1) {
- *buf = '\0';
- return -1;
- }
- if (server_ready() == -1) {
- fprintf(stderr, "%s: world server not ready\n", basename);
- *buf = '\0';
- return -1;
- }
- result = readstr(serverfile, buf);
- if (result < 0) {
- return -1;
- }
- return result;
- }
-
- int server_ready(void) {
- int ready, ret;
- fd_set readfds;
- struct timeval timeout;
- int retry;
-
- if (serverfile <= 0 || initstat == -1) {
- return -1;
- }
- retry = 100;
- timeout.tv_sec = 0;
- timeout.tv_usec = 100000;
- ready = 0;
- while (!ready) {
- FD_ZERO(&readfds);
- FD_SET(serverfile, &readfds);
- ret = select(FD_SETSIZE, &readfds, NULL, NULL, &timeout);
- if (ret < 0) {
- close(serverfile);
- initstat = -1;
- serverfile = -1;
- return -1;
- } else if (ret > 0) {
- ready = 1;
- } else if (retry -- < 0) {
- close(serverfile);
- serverfile = -1;
- initstat = -1;
- return -1;
- }
- }
- return 0;
- }
-
- int server_wridy(void) {
- int wridy, ret;
- fd_set writefds;
- struct timeval timeout;
- int retry;
-
- if (serverfile <= 0 || initstat == -1) {
- return -1;
- }
- retry = 100;
- timeout.tv_sec = 0;
- timeout.tv_usec = 100000;
- wridy = 0;
- while (!wridy) {
- FD_ZERO(&writefds);
- FD_SET(serverfile, &writefds);
- ret = select(FD_SETSIZE, NULL, &writefds, NULL, &timeout);
- if (ret < 0) {
- close(serverfile);
- serverfile = -1;
- initstat = -1;
- return -1;
- } else if (ret > 0) {
- wridy = 1;
- } else if (retry -- < 0) {
- close(serverfile);
- serverfile = -1;
- initstat = -1;
- return -1;
- }
- }
- return 0;
- }
-
- /*__________________________________________________________________
- |
- | read_serverscore - read the score list
- |
- | if the list does not exists, a default one is created.
- |
- */
-
- int read_serverscore(scorelist_t *scorelist) {
-
- char tmpstr[128];
- char tmpstr2[256];
- int i;
- char *slash;
-
- tmpstr[0] = '\0';
- if (initstat == -1 || serverfile == -1 ||
- read_serverstr(tmpstr) <= 0 || strncmp(tmpstr, "BLIX", 4)) {
- scorelist->game = 1;
- scorelist->id = 1;
- for (i=0; i<7; i++) {
- strcpy(scorelist->names[i], "Blix");
- strcpy(scorelist->hosts[i], "Xtreme Graphics Software");
- *(scorelist->images[i]) = '\0';
- scorelist->scores[i] = 2000 - i * 250;
- scorelist->addrs[i] = 0;
- }
- } else {
- if (read_server(&(scorelist->game), sizeof(long)) < 0) return -1;
- if (read_server(&(scorelist->id), sizeof(long))< 0) return -1;
- for (i=0; i<7; i++) {
- if (read_serverstr(tmpstr) < 0) return -1;
- tmpstr[47] = '\0';
- strcpy(scorelist->names[i], tmpstr);
- if (read_serverstr(tmpstr) < 0) return -1;
- tmpstr[47] = '\0';
- strcpy(scorelist->hosts[i], tmpstr);
- if (read_serverstr(tmpstr) < 0) return -1;
- if (*tmpstr != '\0') {
- strcpy(tmpstr2, BLIXTMPDIR);
- strcat(tmpstr2, "/");
- slash = strrchr(tmpstr, '/');
- if (slash != NULL) {
- strcat(tmpstr2, slash+1);
- strcpy(scorelist->images[i], tmpstr2);
- } else {
- strcpy(scorelist->images[i], tmpstr);
- }
- } else {
- *(scorelist->images[i]) = '\0';
- }
- if (read_server(&(scorelist->scores[i]), sizeof(long)) < 0)
- return -1;
- if (read_server(&(scorelist->addrs[i]), sizeof(long)) < 0)
- return -1;
- }
- }
- return 0;
- }
-
- int read_serverimg(scorelist_t *scorelist, int imagenum) {
- char tmpstr[128];
- char tmpstr2[256];
- int img;
- long image_size = 0;
- char *imagedata;
-
- if (read_serverstr(tmpstr) < 0) {
- return -1;
- }
- if (*tmpstr != '\0') {
- strcpy(tmpstr2, BLIXTMPDIR "/");
- strcat(tmpstr2, tmpstr);
- img = open(tmpstr2, O_WRONLY | O_CREAT, 0666);
- if (img < 0) {
- *tmpstr = '\0';
- }
- }
- strcpy(scorelist->images[imagenum], tmpstr);
- if (read_server(&image_size, sizeof(long)) < 0) {
- *(scorelist->images[imagenum]) = '\0';
- return -1;
- }
- if (image_size > 0) {
- imagedata = (char *) malloc(image_size);
- read_server(imagedata, -image_size);
- if (*tmpstr != '\0') {
- write_data(img, imagedata, -image_size);
- close(img);
- }
- free(imagedata);
- }
- return 0;
- }
-
- int write_server(void *buf, int nbyte) {
- int result;
- if (initstat == -1 || serverfile == 0 || server_wridy()) {
- return -1;
- }
- result = write_data(serverfile, buf, nbyte);
- if (result != nbyte && result != -nbyte) {
- return -1;
- }
- return result;
- }
-
- int openserver(void) {
- if (initstat == -1)
- return -1;
- if (serverfile != -1) {
- close(serverfile);
- serverfile = -1;
- }
- init_connect();
- return (make_connect());
- }
- void closeserver(void) {
- close(serverfile);
- serverfile = -1;
- }
-